0 關注者

片段快取

片段快取指的是快取網頁的片段。例如,如果一個頁面在表格中顯示年度銷售摘要,您可以將此表格儲存在快取中,以消除為每個請求生成此表格所需的時間。片段快取建立在資料快取之上。

若要使用片段快取,請在視圖中使用以下結構

if ($this->beginCache($id)) {

    // ... generate content here ...

    $this->endCache();
}

也就是說,將內容生成邏輯封閉在一對beginCache()endCache()呼叫之間。如果在快取中找到內容,beginCache()將呈現快取內容並返回false,從而跳過內容生成邏輯。否則,將呼叫您的內容生成邏輯,並且當呼叫endCache()時,將捕獲生成的內容並將其儲存在快取中。

如同資料快取,需要唯一的 $id 來識別內容快取。

要刪除片段快取,您可以使用 `php Yii::$app->cache->delete(['yii\widgets\FragmentCache', $id]); `

快取選項

您可以透過將選項陣列作為第二個參數傳遞給beginCache()方法,來指定有關片段快取的其他選項。在幕後,此選項陣列將用於配置yii\widgets\FragmentCache小部件,該小部件實現了實際的片段快取功能。

持續時間

片段快取最常用的選項可能是duration。它指定內容在快取中可以保持有效的秒數。以下程式碼將內容片段快取最多一小時

if ($this->beginCache($id, ['duration' => 3600])) {

    // ... generate content here ...

    $this->endCache();
}

如果未設定選項,則將採用預設值 60,這表示快取內容將在 60 秒後過期。

依賴關係

如同資料快取,正在快取的內容片段也可以具有依賴關係。例如,正在顯示的文章內容取決於文章是否被修改。

若要指定依賴關係,請設定dependency選項,它可以是yii\caching\Dependency物件,或是用於建立依賴物件的配置陣列。以下程式碼指定片段內容取決於 updated_at 欄位值的變更

$dependency = [
    'class' => 'yii\caching\DbDependency',
    'sql' => 'SELECT MAX(updated_at) FROM post',
];

if ($this->beginCache($id, ['dependency' => $dependency])) {

    // ... generate content here ...

    $this->endCache();
}

變化

正在快取的內容可能會根據某些參數而有所變化。例如,對於支援多種語言的 Web 應用程式,同一段視圖程式碼可能會生成不同語言的內容。因此,您可能希望根據目前的應用程式語言使快取內容有所變化。

若要指定快取變化,請設定variations選項,它應該是一個純量值陣列,每個值代表一個特定的變化因素。例如,若要使快取內容根據語言而變化,您可以使用以下程式碼

if ($this->beginCache($id, ['variations' => [Yii::$app->language]])) {

    // ... generate content here ...

    $this->endCache();
}

切換快取

有時您可能只想在滿足特定條件時才啟用片段快取。例如,對於顯示表單的頁面,您只想在最初請求表單時(透過 GET 請求)快取表單。任何後續的表單顯示(透過 POST 請求)都不應快取,因為表單可能包含使用者輸入。若要執行此操作,您可以設定enabled選項,如下所示

if ($this->beginCache($id, ['enabled' => Yii::$app->request->isGet])) {

    // ... generate content here ...

    $this->endCache();
}

巢狀快取

片段快取可以是巢狀的。也就是說,快取的片段可以封閉在另一個也快取的片段內。例如,註解被快取在內部片段快取中,並且它們與文章內容一起被快取在外部片段快取中。以下程式碼顯示了如何巢狀兩個片段快取

if ($this->beginCache($id1)) {

    // ...content generation logic...

    if ($this->beginCache($id2, $options2)) {

        // ...content generation logic...

        $this->endCache();
    }

    // ...content generation logic...

    $this->endCache();
}

可以為巢狀快取設定不同的快取選項。例如,內部快取和外部快取可以使用不同的快取持續時間值。即使外部快取中快取的資料失效,內部快取仍可能提供有效的內部片段。但是,反之則不然。如果外部快取被評估為有效,即使在內部快取中的內容失效後,它仍將繼續提供相同的快取副本。因此,您必須小心設定巢狀快取的持續時間或依賴關係,否則過時的內部片段可能會保留在外部片段中。

動態內容

使用片段快取時,您可能會遇到這樣的情況:除了在一個或幾個位置之外,大部分內容片段都相對靜態。例如,頁首可能會顯示主選單列以及目前使用者的姓名。另一個問題是,正在快取的內容可能包含必須為每個請求執行的 PHP 程式碼(例如,用於註冊資源包的程式碼)。這兩個問題都可以透過所謂的動態內容功能來解決。

動態內容表示即使封閉在片段快取中也不應快取的一段輸出。為了使內容始終保持動態,即使正在從快取中提供封閉內容,也必須透過為每個請求執行一些 PHP 程式碼來生成它。

您可以在快取的片段中呼叫yii\base\View::renderDynamic(),以在所需的位置插入動態內容,如下所示,

if ($this->beginCache($id1)) {

    // ...content generation logic...

    echo $this->renderDynamic('return Yii::$app->user->identity->name;');

    // ...content generation logic...

    $this->endCache();
}

renderDynamic()方法將一段 PHP 程式碼作為其參數。PHP 程式碼的返回值被視為動態內容。對於每個請求,都將執行相同的 PHP 程式碼,無論封閉片段是從快取中提供還是不提供。

注意:從 2.0.14 版開始,動態內容 API 透過yii\base\DynamicContentAwareInterface介面及其yii\base\DynamicContentAwareTrait trait 公開。作為範例,您可以參考yii\widgets\FragmentCache類別。

發現錯字或您認為此頁面需要改進?
在 github 上編輯 !